<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // ES5 数组
    // []   new Array();

    // 数组的拓展方法 => 官方提供专门操作数组的方法
    // unshift()   shift()
    // push()    pop()
    // splice()
    // reverse()
    // sort()

    // slice()  concat()
    // join()
    // indexOf()  lastIndexOf()

    // includes()

    // 遍历方法
    // forEach  map filter some every reduce


    // 构造函数Array的方法
    // Array.isArray()


    // ES6新增
    // 构造函数Array的方法
    // Array.from()   将两类对象转为真正的数组：类似数组的对象（伪数组 array-like object）和可遍历（iterable => Set 和 Map）的对象（包括 ES6 新增的数据结构 Set 和 Map）

    // Array.of()   方法用于将一组值，转换为数组。

    // var arr = new Array(10, 20, 30)
    // console.log(arr);

    // var arr = Array.of(10, 20, 30)
    // console.log(arr);

    // new Array() 如果接收一个参数 且为number类型 => 会生成对应长度的数组
    // var arr = new Array(10); // [,,,,,,,,,]
    // console.log(arr);

    // var arr = Array.of(10); // [10]
    // console.log(arr);


    // ES6 数组新增拓展方法

    // 新增遍历方法
    // find()   每次循环时,执行传入的回调函数,回调函数返回一个条件(表达式),返回第一个满足条件的元素  => 找不到:undefned
    // findIndex()  每次循环时,执行传入的回调函数,回调函数返回一个条件(表达式),返回第一个满足条件的元素的下标  找不到:-1

    // findLast()   每次循环时,执行传入的回调函数,回调函数返回最后一个条件(表达式),返回第一个满足条件的元素  => 找不到:undefned
    // findLastIndex()  每次循环时,执行传入的回调函数,回调函数返回最后一个条件(表达式),返回第一个满足条件的元素的下标  找不到:-1


    // filter()  每次循环时,执行传入的回调函数,回调函数返回一个条件(表达式) => 把满足条件的元素放到新数组中
    // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
    // var result = list.filter(function (item, index, array) {
    //     return item % 2 == 0; //返回一个条件 => 把满足条件的元素放到新数组中
    // })
    // console.log(result);


    // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
    // var result = list.find(function (item, index, array) {
    //     // return item % 2 == 0; //偶数
    //     return item > 10; // > 10
    // })
    // console.log(result);

    // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
    // var result = list.findIndex(function (item, index, array) {
    //     // return item % 2 == 0; //偶数
    //     return item > 10; // > 10
    // })
    // console.log(result);


    // fill()  方法使用给定值，填充一个数组 (将数组中的每一个元素改为指定值)
    // 返回值:修改后的原数组
    // 是否影响原数组: 影响
    // var list = [1, 4, 7, 2, 5, 8, 3, 6, 9];
    // var result = list.fill(0);
    // console.log(result);
    // console.log(list);
    // console.log(list === result);

    // // 记录100盏灯的开关状态
    // var arr = new Array(100).fill(false);
    // console.log(arr);


    // includes()   判断数组中是否存在某个元素 (可用于判断数组中是否存在NaN)
    // var list = [1, 4, 7, 2, 5, NaN, 8, 3, 6, 9];
    // console.log(list.indexOf(5));  // 4
    // console.log(list.indexOf(NaN)); // -1

    // console.log(list.includes(NaN)); //true

    // flat()   数组拉平(数组扁平化)  用于将嵌套的数组“拉平”，变成一维的数组
    // 该方法返回一个新数组，对原数据没有影响
    // flat()默认只会“拉平”一层，如果想要“拉平”多层的嵌套数组，可以将flat()方法的参数写成一个整数，表示想要拉平的层数，默认为1。
    // 如果不管有多少层嵌套，都要转成一维数组，可以用Infinity关键字作为参数。

    var list = [1, 2, 3, [4, 5, 6]];

    // function myFlat(list) {
    //     var arr = [];
    //     for (var i = 0; i < list.length; i++) {
    //         var item = list[i];
    //         if (Array.isArray(item)) { // [4,5,6]
    //             var newArr = myFlat(item); // [4,5,6]
    //             arr = arr.concat(newArr);
    //         } else {
    //             arr.push(item);
    //         }
    //     }
    //     console.log(arr); // [1,2,3]
    //     return arr;
    // }

    // var result = myFlat(list);
    // console.log(result);

    // var result = list.toString().split(",")
    // console.log(result);

    var list = [1, 2, 3, [4, 5, 6]];
    var result = list.flat();  // 1
    console.log(result);

    var list = [1, 2, 3, [4, 5, 6, [7, 8, 9]]];
    var result = list.flat(2);
    console.log(result);

    var list = [1, 2, 3, [4, 5, 6, [7, 8, 9, [8, [7, [6, [5, [4]]]]]]]];
    var result = list.flat(Infinity);
    console.log(result);

    // flatMap()   flat和map的组合版 (先map => 根据原数组得到一个新数组,再拉平)

    // 取18和32的约数的 并集
    /* var list = [18, 32];
    var newArr = list.map(function (item) { // 18  32 
        var arr = [];
        for (var i = 1; i <= item; i++) { // 1-item
            if (item % i == 0) {
                arr.push(i);
            }
        }
        return arr;
    })
    console.log(newArr);

    var result = newArr.flat();
    console.log(result); */

    var list = [18, 32];
    var result = list.flatMap(function (item) { // 18  32 
        var arr = [];
        for (var i = 1; i <= item; i++) { // 1-item
            if (item % i == 0) {
                arr.push(i);
            }
        }
        return arr;
    })
    console.log(result);












</script>

</html>